/*
//  作者       ：IT老翟
//  文 件 名   : OLED.ino
//  生成日期   : 2020-4-26
//  功能描述   :ESP8266驱动 OLED 显示分级菜单
//              说明: 管脚定义可以自己任意配置，这里应用的是中景园的函数
//              ----------------------------------------------------------------
//              GND  电源地
//              VCC  5v电源
//              D0   5（SCL）
//              D1   4（SDA）
//              RES  0 (复位)
//              DC   3 (数据和命令标志位)
//              CS   1 （片选）             
//              ----------------------------------------------------------------
*/

#include "oledfont.h"
#include "fun.h"

//按键管脚
#define keyup 12
#define keydown 13
#define keyenter 14

#define uchar unsigned char

uchar func_index = 0; 
void (*current_operation_index)();


typedef struct
{
	uchar current;
	uchar up; //向上翻索引号 
	uchar down; //向下翻索引号 
	uchar enter;//确认索引号	
	void (*current_operation)(); 
}key_table; 

key_table  code_table[10]=
{ 	
  {0,0,1,0,(*fun1)},  //主界面 
  {1,0,2,1,(*fun2)},  //  
  {2,1,3,7,(*fun3)},  //QQ   
  {3,2,4,3,(*fun4)},  //
  {4,3,5,4,(*fun5)},	//关
  {5,4,6,5,(*fun6)},
  {6,5,1,6,(*fun7)},
  {7,6,7,7,(*fun8)},

};

//键值
int up_val, down_val, enter_val;

void setup()
{
  OLED_Init();
  OLED_ColorTurn(0);//0正常显示 1反色显示
  OLED_DisplayTurn(0);//0正常显示 1翻转180度显示
  
  //按键管脚定义
  pinMode(keyup,INPUT_PULLUP); //上拉输入模式
  pinMode(keydown,INPUT_PULLUP);
  pinMode(keyenter,INPUT_PULLUP);
}

void loop()
{
  up_val = digitalRead(keyup);
  down_val = digitalRead(keydown);
  enter_val = digitalRead(keyenter);
 
	if((up_val==LOW)||(down_val==LOW)||(enter_val==LOW)) 		
	{ 			
		delay(10);//消抖 			
		if(up_val==LOW) 		
		{ 
      while(!up_val)//松手检 
      {
        up_val = digitalRead(keyup);
        current_operation_index=code_table[func_index].current_operation;     
        (*current_operation_index)();//执行当前操作函数
      }
      OLED_Clear();
      func_index=code_table[func_index].up; //向上     
		} 
    			
		if(down_val==LOW) 		 	
		{ 	
			while(!down_val)//松手检 
      {
        down_val = digitalRead(keydown);
        current_operation_index=code_table[func_index].current_operation;     
        (*current_operation_index)();//执行当前操作函数
      }
      OLED_Clear();
      func_index=code_table[func_index].down; //向下翻  			
		}
    		 
		if(enter_val==LOW) 			
		{ 
      while(!enter_val)//松手检 
      {
        enter_val = digitalRead(keyenter);
        current_operation_index=code_table[func_index].current_operation;     
        (*current_operation_index)();//执行当前操作函数
      }
      OLED_Clear();
      func_index=code_table[func_index].enter; //确认      			
		} 				
	}
	current_operation_index=code_table[func_index].current_operation; 		
	(*current_operation_index)();//执行当前操作函数
}
